/*********************************************
 * EIRMULATOR is under the beerware license.
 *
 * THE BEERWARE LICENSE (Revision 42):
 *
 * As long as you retain this notice you can
 * do whatever you want with this stuff. If we
 * meet some day, and you think this stuff is 
 * worth it, you can buy me a drink in return.
*/


/** \file maths.cpp
* \brief Implémente des fonctions de géométrie 2d et autres fonctions spécialisés.
* \author JDaM <brossill@enseirb.fr>
* \version 0.8.0
* \date 09.10.2005 @ 15:00
*
*/

#include "maths.h"


dReal scal2d(dReal xa, dReal ya, dReal xb, dReal yb)
{
	return( xa*xb + ya*yb );
}

/* Donne l'angle entre Y et AB */
dReal angle( dReal xa, dReal ya, dReal xb, dReal yb)
{
	/* Retourne un angle entre [-Pi,Pi] */
	dReal alpha = atan2f( yb - ya, xb - xa);
	
	/* Retourne l'angle entre [0,2Pi] */
	//if( alpha < 0.0f ) alpha = alpha + 2.0f*M_PI;

	return alpha;
}

/* Retourne la valeur absolue */
dReal absf( dReal a )
{
	if( a < 0.0f )
		return -1.0f*a;
	else
		return 1.0f*a;
}

/* Calcul la distance entre deux points dans un même plan */
dReal dist2d( dReal x1,dReal y1, dReal x2, dReal y2)
{
	return sqrt( (x1-x2)*(x1-x2) +  (y1-y2)*(y1-y2) );
}

/* Calcul la distance entre deux points dans un même plan */
dReal dist2d_2( dReal x1,dReal y1, dReal x2, dReal y2)
{
	return (x1-x2)*(x1-x2) +  (y1-y2)*(y1-y2);
}

/* Effectue une rotation de alpha du vecteur (ax,ay) selon z */
void rot2d( dReal* ax, dReal* ay, dReal alpha)
{

	dReal tx,ty; /* Scalaires temporaires */
	
	tx = (*ax)*cos(alpha) + (*ay)*sin(alpha);
	ty = -(*ax)*sin(alpha) + (*ay)*cos(alpha);

	(*ax) = tx;
	(*ay) = ty;
}

/* Calcule la norme */
dReal norm2d( dReal x, dReal y)
{
	return (dReal)sqrt(x*x + y*y);
}

/* Retourne 1 si a>0 -1 si a<0*/
dReal sign( dReal a)
{
	if( a >= 0.0 )
		return 1.0;
	else
		return -1.0;
}
		
